package java202507;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;

public class 罗马数字转整数 {

    public static void main(String[] args) {
        System.out.println(romanToInt("MCMXCIV"));
    }

    //I             1
//V             5
//X             10
//L             50
//C             100
//D             500
//M             1000


    /**
     * delete-str方案
     * @param s
     * @return
     */
    public static int romanToInt1(String s) {
        Map<String, Integer> map = new HashMap<>();
        map.put("I", 1);
        map.put("V", 5);
        map.put("X", 10);
        map.put("L", 50);
        map.put("C", 100);
        map.put("D", 500);
        map.put("M", 1000);

        // I 可以放在 V (5) 和 X (10) 的左边，来表示 4 和 9。
// X 可以放在 L (50) 和 C (100) 的左边，来表示 40 和 90。
// C 可以放在 D (500) 和 M (1000) 的左边，来表示 400 和 900。

        Map<String, Integer> map1 = new HashMap<>();
        map1.put("IV", 4);
        map1.put("IX", 9);
        map1.put("XL", 40);
        map1.put("XC", 90);
        map1.put("CD", 400);
        map1.put("CM", 900);
        //解释: M = 1000, CM = 900, XC = 90, IV = 4.
        Integer sum = 0;
        StringBuilder remainingStr = new StringBuilder(s);
        while(true) {
            if (remainingStr.length() == 0) {
                break;
            }
            if (remainingStr.length() >=2) {
                Integer i = map1.get(remainingStr.substring(0, 2));
                if (i != null) {
                    sum = sum + i;
                    remainingStr.delete(0, 2);
                    continue;
                }
            }

            sum = sum + map.get(remainingStr.substring(0,1));
            remainingStr.delete(0, 1);

        }


        return sum;

    }


    /**
     * 遍历，同时判断下一位如果更大，则减去当前这一位
     * @param s
     * @return
     */
    public static int romanToInt(String s) {
        Map<Character, Integer> map = new HashMap<>();
        map.put('I', 1);
        map.put('V', 5);
        map.put('X', 10);
        map.put('L', 50);
        map.put('C', 100);
        map.put('D', 500);
        map.put('M', 1000);

        // I 可以放在 V (5) 和 X (10) 的左边，来表示 4 和 9。
// X 可以放在 L (50) 和 C (100) 的左边，来表示 40 和 90。
// C 可以放在 D (500) 和 M (1000) 的左边，来表示 400 和 900。

        Integer sum = 0;
        for (int i = 0; i < s.length(); i++) {
            Integer j = map.get(s.charAt(i));
            if (i==s.length()-1) {
                sum = sum + j;
                continue;
            }
            Integer j1 = map.get(s.charAt(i + 1));
            if (j<j1) {
                sum = sum - j;
            } else {
                sum = sum + j;
            }
        }
        return sum;
    }
}
